/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.server.services;

import co.com.ces4.produccion.client.LineaProduccionService;
import co.com.ces4.produccion.jpa.controllers.ArticuloLineaJpaController;
import co.com.ces4.produccion.jpa.controllers.LineaProduccionJpaController;
import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.ArticuloLinea;
import co.com.ces4.produccion.jpa.entities.LineaProduccion;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Sebastian
 */
public class LineaProduccionServiceImpl extends RemoteServiceServlet implements LineaProduccionService {

    public LineaProduccion guardarLinea(LineaProduccion linea) throws RuntimeException {
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        lineaProduccionJpaController.create(linea);
        if (!linea.getArticuloLineaList().isEmpty()) {
            ArticuloLineaJpaController articuloLineaJpaController = (ArticuloLineaJpaController) getServletContext().getAttribute("articuloLineaJpaController");
            for (ArticuloLinea articuloLinea : linea.getArticuloLineaList()) {
                try {
                    articuloLineaJpaController.create(articuloLinea);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "El articulo linea no pudo ser guardado debido a que ya ha sido creado anteriormente" + ex.getMessage());
                    throw new RuntimeException("Señor usuario, el articulo linea ya se encuentra registrado en la base de datos, por tanto no pudo ser almacenado");
                } catch (Exception ex) {
                    Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                    throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar guardar los articulos para esta l&iacute;nea de producci&oacute;n en la base de datos");
                }
            }
        }
        return linea;
    }

    public void actualizarLinea(LineaProduccion linea) throws RuntimeException {
        ArticuloLineaJpaController articuloLineaJpaController = (ArticuloLineaJpaController) getServletContext().getAttribute("articuloLineaJpaController");
        for (ArticuloLinea articuloLinea : linea.getArticuloLineaList()) {
            try {
                articuloLineaJpaController.create(articuloLinea);
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "El articulo linea no pudo ser guardado debido a que ya ha sido creado anteriormente" + ex.getMessage());
                throw new RuntimeException("Señor usuario, el articulo linea ya se encuentra registrado en la base de datos, por tanto no pudo ser almacenado");
            } catch (Exception ex) {
                Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar guardar el articulo l&iacute;nea en la base de datos");
            }
        }
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        try {
            lineaProduccionJpaController.edit(linea);
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
            throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar actualizar la l&iacute;nea de producci&oacute;n en la base de datos", ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "La l&iacute;nea de producci&oacute;n que se intenta actualizar no existe en la base de datos" + ex.getMessage());
            throw new RuntimeException("Señor usuario, la l&iacute;nea de producci&oacute;n no se encuentra registrada en la base de datos, por tanto no pudo ser actualizada");
        } catch (Exception ex) {
            Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
            throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar actualizar la l&iacute;nea de producci&oacute;n en la base de datos");
        }
    }

    public List<LineaProduccion> getLineas() throws RuntimeException {
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        return lineaProduccionJpaController.findLineaProduccionEntities();
    }

    public List<LineaProduccion> getLineaList(String codigo, String descripcion) throws RuntimeException {
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        return lineaProduccionJpaController.getLineaList(codigo, descripcion);
    }

    public LineaProduccion getLineaXId(Integer codigo) throws RuntimeException {
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        return lineaProduccionJpaController.findLineaProduccion(codigo);
    }

    public void desactivarLinea(List<LineaProduccion> lineas) throws RuntimeException {
        LineaProduccionJpaController lineaProduccionJpaController = (LineaProduccionJpaController) getServletContext().getAttribute("lineaProduccionJpaController");
        for (LineaProduccion lineaProduccion : lineas) {
            lineaProduccion.setSnestado(false);
            try {
                lineaProduccionJpaController.edit(lineaProduccion);
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Registro no encontrado en la base de datos:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, la l&iacute;nea de producci&oacute;n no se encuentra registrada en la base de datos, por tanto no pudo ser desactivada");
            } catch (Exception ex) {
                Logger.getLogger(LineaProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            }
        }
    }
}
